package com.tea.constans;

import com.tea.service.DeliveryCompanyService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;

/**
 * 快递公司编码映射
 * 现在从数据库获取运力公司映射数据
 */
@Component
@Slf4j
public class ExpressCompanyMapping {
    
    @Resource
    private DeliveryCompanyService deliveryCompanyService;
    
    // 保留一些常用的备用映射，当数据库中没有找到时使用
    private static final Map<String, String> FALLBACK_COMPANY_CODE_MAP = new HashMap<>();
    
    static {
        // 备用快递公司编码映射
        FALLBACK_COMPANY_CODE_MAP.put("顺丰速运", "SF");
        FALLBACK_COMPANY_CODE_MAP.put("顺丰", "SF");
        FALLBACK_COMPANY_CODE_MAP.put("圆通速递", "YTO");
        FALLBACK_COMPANY_CODE_MAP.put("圆通", "YTO");
        FALLBACK_COMPANY_CODE_MAP.put("中通快递", "ZTO");
        FALLBACK_COMPANY_CODE_MAP.put("中通", "ZTO");
        FALLBACK_COMPANY_CODE_MAP.put("申通快递", "STO");
        FALLBACK_COMPANY_CODE_MAP.put("申通", "STO");
        FALLBACK_COMPANY_CODE_MAP.put("韵达速递", "YD");
        FALLBACK_COMPANY_CODE_MAP.put("韵达", "YD");
        FALLBACK_COMPANY_CODE_MAP.put("百世快递", "HTKY");
        FALLBACK_COMPANY_CODE_MAP.put("百世", "HTKY");
        FALLBACK_COMPANY_CODE_MAP.put("德邦快递", "DBL");
        FALLBACK_COMPANY_CODE_MAP.put("德邦", "DBL");
        FALLBACK_COMPANY_CODE_MAP.put("京东快递", "JD");
        FALLBACK_COMPANY_CODE_MAP.put("京东", "JD");
        FALLBACK_COMPANY_CODE_MAP.put("邮政速递", "YZPY");
        FALLBACK_COMPANY_CODE_MAP.put("EMS", "YZPY");
        FALLBACK_COMPANY_CODE_MAP.put("天天快递", "HHTT");
        FALLBACK_COMPANY_CODE_MAP.put("天天", "HHTT");
        FALLBACK_COMPANY_CODE_MAP.put("宅急送", "ZJS");
        FALLBACK_COMPANY_CODE_MAP.put("国通快递", "GTO");
        FALLBACK_COMPANY_CODE_MAP.put("国通", "GTO");
        FALLBACK_COMPANY_CODE_MAP.put("优速快递", "UC");
        FALLBACK_COMPANY_CODE_MAP.put("优速", "UC");
        FALLBACK_COMPANY_CODE_MAP.put("极兔速递", "JTSD");
        FALLBACK_COMPANY_CODE_MAP.put("极兔", "JTSD");
    }
    
    /**
     * 根据快递公司名称获取编码
     * 优先从数据库获取，如果没有找到则使用备用映射
     * @param companyName 快递公司名称
     * @return 快递公司编码
     */
    public String getCompanyCode(String companyName) {
        if (companyName == null) {
            return "OTHER";
        }
        
        try {
            // 1. 优先从数据库获取运力公司编码
            String deliveryId = deliveryCompanyService.getDeliveryIdByName(companyName);
            if (deliveryId != null) {
                log.debug("从数据库获取到运力公司编码: {} -> {}", companyName, deliveryId);
                return deliveryId;
            }
        } catch (Exception e) {
            log.warn("从数据库获取运力公司编码失败: {}, 将使用备用映射", companyName, e);
        }
        
        // 2. 数据库中没有找到，使用备用映射进行精确匹配
        String code = FALLBACK_COMPANY_CODE_MAP.get(companyName);
        if (code != null) {
            log.debug("从备用映射获取到运力公司编码: {} -> {}", companyName, code);
            return code;
        }
        
        // 3. 备用映射模糊匹配
        for (Map.Entry<String, String> entry : FALLBACK_COMPANY_CODE_MAP.entrySet()) {
            if (companyName.contains(entry.getKey()) || entry.getKey().contains(companyName)) {
                log.debug("从备用映射模糊匹配到运力公司编码: {} -> {}", companyName, entry.getValue());
                return entry.getValue();
            }
        }
        
        log.warn("未找到运力公司编码: {}, 返回默认值OTHER", companyName);
        return "OTHER";
    }
    
    /**
     * 获取所有支持的快递公司
     * 优先从数据库获取，如果获取失败则返回备用映射
     * @return 快递公司映射表
     */
    public Map<String, String> getAllCompanies() {
        Map<String, String> companyMap = new HashMap<>();
        
        try {
            // 从数据库获取启用的运力公司
            var companies = deliveryCompanyService.getEnabledDeliveryCompanies();
            for (var company : companies) {
                companyMap.put(company.getDeliveryName(), company.getDeliveryId());
            }
            
            if (!companyMap.isEmpty()) {
                log.debug("从数据库获取到{}家运力公司", companyMap.size());
                return companyMap;
            }
        } catch (Exception e) {
            log.warn("从数据库获取运力公司列表失败，将使用备用映射", e);
        }
        
        // 如果数据库获取失败，返回备用映射
        log.debug("使用备用映射，共{}家运力公司", FALLBACK_COMPANY_CODE_MAP.size());
        return new HashMap<>(FALLBACK_COMPANY_CODE_MAP);
    }
}